home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994 November: Tool Chest / Dev.CD Nov 94.toast / Sample Code / Snippets / Files / ParseFullPathname / parsefullpathname.c text < prev    next >
Encoding:
Text File  |  1992-07-15  |  1.8 KB  |  82 lines  |  [TEXT/MPS ]

  1. #include <stdio.h>
  2. #include <files.h>
  3. #include <String.h>
  4. #include <Strings.h>
  5. #include <Memory.h>
  6. #include <Errors.h>
  7.  
  8. OSErr ParseFullPathname (FSSpec *Result, char *PathNamePtr);
  9. Boolean GetElement (StringPtr Result,char * PathNamePtr,short ElementNumber);
  10.  
  11. main (int argc,char ** argv)
  12. {
  13.     OSErr        err;
  14.     FSSpec        here;
  15.     
  16.     if (argc != 2)
  17.         printf ("form: pfpn <pathname>\n");
  18.     
  19.     err = ParseFullPathname (&here, argv[1]);
  20.     if (err)
  21.         printf ("Died of error %d\n",err);
  22.     else
  23.         printf ("vRefNum %d DirID %d name %P\n",here.vRefNum, here.parID,here.name);
  24. }
  25.  
  26. Boolean GetElement (StringPtr Result,char *PathNamePtr,short ElementNumber)
  27. {
  28.     char             *eStart, *eEnd;
  29.     
  30.     eStart = eEnd = PathNamePtr;
  31.     
  32.     while (*eEnd && ElementNumber) {
  33.         if (*eEnd == ':') {
  34.             --ElementNumber;
  35.             if (ElementNumber == 1)
  36.                 eStart = eEnd + 1;
  37.         }
  38.         ++eEnd;
  39.     }
  40.     
  41.     if (ElementNumber || (eEnd - eStart > 32) || (eEnd - eStart == 0))
  42.         return false;
  43.  
  44.     BlockMove ((Ptr) eStart, (Ptr) (Result + 1),
  45.         *Result = (char)eEnd - eStart);
  46.     
  47.     return true;
  48. }
  49.  
  50.  
  51. OSErr ParseFullPathname (FSSpec *Result,char *PathNamePtr)
  52. {
  53.     OSErr            err;
  54.     short            level = 2;
  55.     CInfoPBRec        dInfo;
  56.     HParamBlockRec    vInfo;
  57.  
  58.     Result->parID = fsRtDirID;
  59.  
  60.     if (GetElement ((StringPtr) &Result->name, PathNamePtr, 1)) {
  61.         vInfo.volumeParam.ioVRefNum =     0;
  62.         vInfo.volumeParam.ioNamePtr =    &Result->name;
  63.         vInfo.volumeParam.ioVolIndex =    -1;
  64.         err = PBHGetVInfo (&vInfo,false);
  65.         if (err) return err;
  66.         Result->vRefNum = vInfo.volumeParam.ioVRefNum;
  67.     }
  68.  
  69.     while (GetElement ((StringPtr) &Result->name, PathNamePtr, level)) {
  70.         --*(Result->name);
  71.         dInfo.dirInfo.ioFDirIndex = 0;
  72.         dInfo.dirInfo.ioDrDirID = Result->parID;
  73.         dInfo.dirInfo.ioVRefNum = Result->vRefNum;
  74.         dInfo.dirInfo.ioNamePtr = &Result->name;
  75.         err = PBGetCatInfo (&dInfo,false);
  76.         if (err) return err;
  77.         Result->parID = dInfo.dirInfo.ioDrDirID;
  78.         ++level;
  79.     }
  80.     return noErr;
  81. }
  82.